OAK-12244: index nodes that gain a mixin rule, delete stale docs when…#2949
OAK-12244: index nodes that gain a mixin rule, delete stale docs when…#2949thomasmueller wants to merge 3 commits into
Conversation
… mixin rule is lost (#2938) When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes added or removed), FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on transitions: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocuments Tests added: - PropertyIndexCommonTest: two end-to-end integration tests (all backends) - LuceneIndexEditor2Test: two unit tests verifying writer.docs / writer.deletedPaths
|
) Root cause: when a node gains or loses a mixin type at runtime, FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions. Fix: track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on the indexing-rule transition: - !wasIndexable && isIndexable(): node gained a rule → addOrUpdate - wasIndexable && !isIndexable(): node lost a rule → deleteDocument Split FulltextIndexWriter into two explicit operations: - deleteDocumentTree(path): node physically removed; cascade is correct - deleteDocument(path): node lost indexability at runtime; exact only The original deleteDocuments used a PrefixQuery that cascaded to all descendants; in the mixin-loss branch this was a bug — children carrying their own mixin types were incorrectly evicted from the index. Additional changes: - Snapshot FT_OAK_12244_DISABLE once per commit cycle in FulltextIndexEditorContext as typeChangeTrackingEnabled so enter() and leave() always agree - Skip getApplicableIndexingRule(before) on the hot path via hasNodeTypeChange guard when neither jcr:primaryType nor jcr:mixinTypes changed - Register FT_OAK_12244 toggle in ElasticIndexProviderService - Reuse CommitFailedException code 5 for the deleteDocument error path Tests: - PropertyIndexCommonTest: end-to-end integration tests (all backends) - LuceneIndexEditor2Test: unit tests verifying writer.docs / writer.deletedPaths - Verified: 1245 tests, 0 failures in oak-lucene
Commit-Check ❌ |
fabriziofortino
left a comment
There was a problem hiding this comment.
The logic looks good to me. I just added a potential improvement.
Re feature toggles: the number of toggles are increasing. The code is getting more complex because of them (a lot of if/else). It's okay to have them in the short term, but I am concerned they won't be removed. I suggest adding a time-bombed test (eg https://github.com/apache/jackrabbit-oak/pull/2925/changes#diff-7f701488919abf1ac0a96ed15d558fc9615f2dc3a420f5ec58545fca43ba7990R38-R44) so that we won't forget to remove them.
| public boolean isTypeChangeTrackingEnabled() { | ||
| return typeChangeTrackingEnabled; | ||
| } | ||
|
|
There was a problem hiding this comment.
I would remove this and rollback all the changes in this class. The typeChangeTrackingEnabled is always based on the FT flag and isTypeChangeTrackingEnabled is only called in FulltextIndexEditor that defines the toggle. Since the toggle should be removed after a while, I propose rollback the changes in this class and explicitly check the FT flag instead of calling context.isTypeChangeTrackingEnabled().



… mixin rule is lost (#2938)
TODO: right now the PR does a descendent-document delete if the primary type or mixin is changed / removed. This is incorrect and needs to be fixed.
When an existing node's applicable indexing rule changes at runtime (e.g. jcr:mixinTypes added or removed), FulltextIndexEditor did not update the index because propertiesChanged was never set — jcr:mixinTypes is not normally listed in a rule's property definitions.
Track wasIndexable (rule matched before) alongside isIndexable() (rule matches after). In leave(), act on transitions:
Tests added: